home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1993 April
/
CICA MS Windows - April 1993.iso
/
unzipped
/
programr
/
vbasic
/
mhctl
/
mhctl.c
Wrap
C/C++ Source or Header
|
1993-01-09
|
4KB
|
125 lines
//
// GetMenuHctl
//
// this code demonstrates, how one can get a menu's control handle in a
// custom control for VB2. It can be used e.g. during the processing
// of WM_MENUSELECT to get the tag property of a menu entry.
//
// the code is taken (with some modifications) from the last version of my
// status bar control, where it is used to fire the SelectedTag event.
// I will upload the control within the next days.
//
// Input: HWND hWndForm window handle of the form
// WORD wp see SDK documentation for WM_MENUSELECT
// LONG lp ...
//
// Return: hctlMenu control handle (or NULL)
//
// THIS CODE USES UNDOCUMENTED FEATURES OF VB2, AND THERE WILL BE CHANGES
// NEEDED FOR FUTURE VERSIONS. WE ALL SHOULD HOPE, THAT MS WILL MAKE THE
// CONTROL HANDLE OF MENU ITEMS AVAILABLE WITH AN API CALL.
//
// I had a similar routine working for VB1 (see version 1.x of StBar), but
// it could not be ported to VB2, becaused it depended on assumptions on
// the messages, message ordering, and menu item ids.
//
// Any comment to this is welcome
//
// Bernd Beekes, 100031,2063
//
#include <windows.h>
#include <vbapi.h>
#define MENU_OFFSET 7
#define ITEM_OFFSET 8
#define MENU_CONTROL "MENU"
HCTL NEAR GetMenuHctl(HWND hWndForm, WORD wp, LONG lp)
{
HMENU hMenu;
SHORT fwMenu;
HCTL hctl;
HCTL hctlMenu;
SHORT nMinItem;
WORD nItem;
LPMODEL lpModel;
LPSHORT lpMenuStruct;
LPSTR lpszName;
// get menu handle and flags
fwMenu = LOWORD(lp);
hMenu = (HMENU) HIWORD(lp);
// ignore menu closing, separators, system menu, ...
if (hMenu == 0)
return NULL;
if (fwMenu & MF_SEPARATOR)
return NULL;
if (fwMenu & MF_SYSMENU)
return NULL;
// determine menu handle and item number
if (fwMenu & MF_POPUP)
{
hMenu = (HMENU) wp;
nItem = 0;
}
else
{
nItem = wp;
}
// initialize variables and walk thru control collection
nMinItem = -1;
hctlMenu = NULL;
hctl = VBGetHwndControl(hWndForm);
hctl = VBGetControl(hctl, GC_CHILD);
hctl = VBGetControl(hctl, GC_FIRSTCONTROL);
while (hctl != NULL)
{
lpModel = VBGetControlModel(hctl);
lpszName = (LPSTR) MAKELONG(lpModel->npszClassName, (_segment) lpModel);
if (lstrcmpi(lpszName, MENU_CONTROL) == 0)
{
lpMenuStruct = (LPSHORT) VBDerefControl(hctl);
if ((HMENU) *(lpMenuStruct + MENU_OFFSET) == hMenu)
{
// for menu items the item id is at lpMenuStruct + ITEM_OFFSET
if (nItem != 0 && (WORD) *(lpMenuStruct + ITEM_OFFSET) == nItem)
{
hctlMenu = hctl;
break;
}
// for pop up entries, look for the entry with minimal id !!!
if (nItem == 0)
{
if (nMinItem == -1 || nMinItem > *(lpMenuStruct + ITEM_OFFSET))
{
nMinItem = *(lpMenuStruct + ITEM_OFFSET);
hctlMenu = hctl;
}
}
}
}
hctl = VBGetControl(hctl, GC_NEXTCONTROL);
}
return hctlMenu;
}